package com.bjsxt.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bjsxt.domain.Coin;
import com.bjsxt.dto.CoinDto;
import com.bjsxt.mapper.CoinMapper;
import com.bjsxt.mappers.CoinDtoMapper;
import com.bjsxt.service.CoinService;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;

import java.util.Collections;
import java.util.List;

@Service
public class CoinServiceImpl extends ServiceImpl<CoinMapper, Coin> implements CoinService {

    /**
     * 根据传入的 page 规则分页查询数字货币
     *
     * @param page   分页对象<Coin>
     * @param name   币种名称
     * @param type   币种类型，xnb：人民币,default：比特币系列,ETH：以太坊,ethToken：以太坊代币,
     * @param status 状态，status=1：启用,0：禁用
     * @param title  币种标题
     * @param wallet 钱包类型，rgb：认购币,qbb：钱包币
     * @return 根据条件查询出的数字货币分页数据
     */
    @Override
    public Page<Coin> pageByNameAndTypeAndStatusAndTitleAndWalletType(Page<Coin> page, String name, String type, Byte status, String title, String wallet) {
        // 调用分页方法进行数据的查询
        return page(page, new LambdaQueryWrapper<Coin>()
                .like(StringUtils.isNotEmpty(name), Coin::getName, name)
                .eq(StringUtils.isNotBlank(type), Coin::getType, type)
                .eq(status != null, Coin::getStatus, status)
                .like(StringUtils.isNotBlank(title), Coin::getTitle, title)
                .eq(StringUtils.isNotBlank(wallet), Coin::getWallet, wallet)
        );
    }

    /**
     * 根据状态查询所有的币种
     *
     * @param status 状态：0: 无效 1:有效
     * @return 币种数据集合
     */
    @Override
    public List<Coin> listByStatus(Byte status) {
        // 调用业务层进行数据的查询并返回
        return list(new LambdaQueryWrapper<Coin>().eq(Coin::getStatus, status));
    }

    /**
     * 根据币种名称获取币种数据
     *
     * @param coinName 币种名称
     * @return 币种数据
     */
    @Override
    public Coin getByCoinName(String coinName) {
        // 构建查询并返回
        return getOne(new LambdaQueryWrapper<Coin>().eq(Coin::getName, coinName));
    }

    /**
     * 使用 ID集合查询币种数据
     *
     * @param ids id 集合
     * @return 币种集合数据
     */
    @Override
    public List<CoinDto> getByIds(List<Long> ids) {
        // 调用方法查询数据
        List<Coin> coins = listByIds(ids);
        // 如果查询的数据是空则直接返回空集合
        if (coins == null) return Collections.emptyList();
        // 调用方法进行对象的转换
        return CoinDtoMapper.INSTANCE.convert2Dto(coins);
    }
}
